//------------------------------------------------------------------------------
/** @file         f_listmembres.cpp
 *  @brief        Permet la recherche de membres selon certains critère
 *
 *  @author       PADIOU Nicolas
 *  @author       STS IRIS, Lyce Nicolas APPERT, ORVAULT (FRANCE)
 *  @since        01/01/2012
 *  @version      0.1
 *  @date         11/05/2012
 *
 *  Description dtaille du fichier f_listmembres.ccp
 *
 *  @bug          aucun connu
 */
//------------------------------------------------------------------------------

#include "f_listemembres.h"
#include "ui_f_listemembres.h"

#include <iostream>
#include <QStandardItem>

using namespace std ;

F_ListeMembres::F_ListeMembres(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::F_ListeMembres)
{
    ui->setupUi(this);

    //Initialisation de la liste de titres et de types
    this->MaJTitre() ;
    this->MaJType() ;
}

F_ListeMembres::~F_ListeMembres()
{
    delete ui;
}

void F_ListeMembres::TousSelectionner( bool bSelection )
{
    ui->ChBx_Type->setChecked( bSelection ) ;

    ui->ChBx_Titre->setChecked( bSelection ) ;

    ui->ChBx_Nom->setChecked( bSelection ) ;

    ui->ChBx_Prenom->setChecked( bSelection ) ;

    ui->ChBx_Ville->setChecked( bSelection ) ;

    ui->ChBx_CodePostal->setChecked( bSelection ) ;

    ui->ChBx_NbreRetard->setChecked( bSelection ) ;

    ui->ChBx_AncienMembre->setChecked( bSelection ) ;

    ui->ChBx_DateInscription->setChecked( bSelection ) ;

    ui->ChBx_DateNaissance->setChecked( bSelection ) ;

    ui->ChBx_Cotisation->setChecked( bSelection ) ;

    ui->ChBx_Abonnements->setChecked( bSelection ) ;
}

/** Description dtaille de la mthode
 *  @pre    Combobox remplie avec le vecteur
 *  @param  unsigned int nIdTitre
 *  @retval int
 *  @return L'emplacement du titre dans le vecteur par rapport Ã  l'id (0 par dÃ©faut)
 *  @test   Voir la procdure dans le fichier associ.
 */
int F_ListeMembres::EmplacementTitreVector( unsigned int nIdTitre )
{
    int nEmplacementTitre (0) ;
    int nBoucle           (0) ;

    //Recherche de l'id dans le vecteur tant que l'on a pas fini de parcour le vecteur
    while( nBoucle < this->VectorTitre.size() && nEmplacementTitre == 0 && nIdTitre != 0 )
    {
        if( this->VectorTitre[ nBoucle ].id == nIdTitre )
        {
            nEmplacementTitre = nBoucle ;
        }
        nBoucle ++ ;
    }
    return nEmplacementTitre ;
}

/** Description dtaille de la mthode
 *  @pre    Combobox remplie avec le vecteur
 *  @param  unsigned int nIdTytre
 *  @retval int
 *  @return L'emplacement du titre dans le vecteur par rapport Ã  l'id (0 par dÃ©faut)
 *  @test   Voir la procdure dans le fichier associ.
 */
int F_ListeMembres::EmplacementTypeVector(unsigned int nIdType )
{
    int nEmplacementType (0) ;
    int nBoucle          (0) ;

    //Recherche de l'id dans le vecteur tant que l'on a pas fini de parcour le vecteur
    while( nBoucle < this->VectorType.size() && nEmplacementType == 0 && nIdType != 0 )
    {
        if( this->VectorType[ nBoucle ].id == nIdType )
        {
            nEmplacementType = nBoucle ;
        }
        nBoucle ++ ;
    }

    return nEmplacementType ;
}

/** Description dtaille de la mthode
 *  @pre    AccÃ©s Ã  la base de donnÃ©es
 *  @test   Voir la procdure dans le fichier associ.
 */
void F_ListeMembres::MaJType ()
{
    int i           (0)      ;
    QSqlQuery query          ;
    Type oType               ;

    //Suppression du contenu du vecteur de la combobox CBx_Type
    this->VectorType.clear() ;
    ui->CBx_Type->clear() ;

    //ExÃ©cution de la requÃªte qui sÃ©lectionne le contenu de la table tytremembres
    if( query.exec( "SELECT * FROM typemembres ;" ) )
    {
        oType.id = 0 ;
        oType.sType = "" ;
        this->VectorType.push_back( oType ) ;

        //Remplissage du vecteur avec ce que retourne la requÃªte
        while( query.next() )
        {
            oType.id = query.value(0).toInt() ;
            oType.sType = query.value(1).toString() ;

            this->VectorType.push_back(oType) ;
        }

        //Remplissage de la combobox grace au vecteur
        for( i = 0 ; i < VectorType.size() ; i ++ )
        {
            ui->CBx_Type->insertItem( i, VectorType[ i ].sType ) ;
        }
    }
    else //Sinon on affiche un message d'erreur et on retourne Faux
    {
        cerr << "F_Membres::MaJType () : Erreur de connexion avec la base de donne !" << endl ;
    }
}

/** Description dtaille de la mthode
 *  @pre    AccÃ©s Ã  la base de donnÃ©es
 *  @test   Voir la procdure dans le fichier associ.
 */
void F_ListeMembres::MaJTitre ()
{
    int i           (0)      ;
    QSqlQuery query          ;
    Titre oTitre             ;

    //Suppression du contenu du vecteur de la combobox CBx_Titre
    this->VectorTitre.clear() ;
    ui->CBx_Titre->clear() ;

    //ExÃ©cution de la requÃªte qui sÃ©lectionne le contenu de la table titremembre
    if( query.exec( "SELECT * FROM titremembre" ) )
    {
        oTitre.id = 0 ;
        oTitre.sTitre = "" ;
        this->VectorTitre.push_back( oTitre ) ;

        //Remplissage du vecteur avec ce que retourne la requÃªte
        while( query.next() )
        {
            oTitre.id = query.value(0).toInt() ;
            oTitre.sTitre = query.value(1).toString() ;

            this->VectorTitre.push_back( oTitre ) ;
        }

        //Remplissage de la combobox grace au vecteur
        for( i = 0 ; i < VectorTitre.size() ; i ++ )
        {
            ui->CBx_Titre->insertItem( i, VectorTitre[i].sTitre ) ;
        }
    }
    else //Sinon on affiche un message d'erreur et on retourne Faux
    {
        cerr << "F_Membres::MaJTitre () : Erreur de connexion avec la base de donne !" << endl ;
    }
}

bool F_ListeMembres::AffichageListe()
{
    QString sRequeteSELECTFROM ;
    QString sRequeteWHERE      ;
    QString sRequete           ;
    QString sNumero            ;
    int     i            ( 0 ) ;
    QSqlQuery query ;


    QStandardItemModel * modele = new QStandardItemModel() ;
    ui->TbW_ListeMembre->setModel(modele) ;
    ui->TbW_ListeMembre->setEditTriggers(0) ;
    ui->TbW_ListeMembre->setEditTriggers(QAbstractItemView::SelectedClicked);


    sRequeteSELECTFROM = "SELECT * FROM membres" ;
    sRequeteWHERE = "WHERE" ;

    if ( ui->ChBx_Type->isChecked() && ui->CBx_Type->currentIndex() != 0 )
    {
        sRequeteWHERE = sRequeteWHERE + " TypeMembres_IdTypeMembres=" +  sNumero.setNum(this->VectorType[ui->CBx_Type->currentIndex()].id) + " AND" ;
    }

    if ( ui->ChBx_Titre->isChecked() && ui->CBx_Titre->currentIndex() != 0)
    {
        sRequeteWHERE = sRequeteWHERE + " TitreMembre_IdTitreMembre=" + sNumero.setNum(this->VectorTitre[ui->CBx_Titre->currentIndex()].id) + " AND" ;
    }

    if( ui->ChBx_Nom->isChecked() )
    {
        sRequeteWHERE =  sRequeteWHERE + " Nom LIKE '%" + ui->LE_Nom->text() + "%' AND" ;
    }

    if( ui->ChBx_Prenom->isChecked() )
    {
        sRequeteWHERE = sRequeteWHERE + " Prenom LIKE '%" + ui->LE_Prenom->text() + "%' AND" ;
    }

    if( ui->ChBx_NbreRetard->isChecked() )
    {
        sRequeteWHERE = sRequeteWHERE + " NbreRetard=" + ui->SBx_NbreRetard->text() + " AND" ;
    }

    if( ui->ChBx_Ville->isChecked() )
    {
        sRequeteWHERE = sRequeteWHERE + " Ville LIKE '%" + ui->LE_Ville->text() + "%' AND" ;
    }

    if( ui->ChBx_Retard->isChecked() )
    {
        sRequeteSELECTFROM = sRequeteSELECTFROM + ", emprunts" ;
        sRequeteWHERE = sRequeteWHERE + " emprunts.DateRetour IS NULL AND emprunts.DateRetourPrevu<" + sNumero.setNum( QDateTime::currentDateTime().toTime_t() ) + " AND IDMembre=emprunts.Membres_IdMembre AND" ;
    }

    if( ui->ChBx_CodePostal->isChecked() )
    {
        sRequeteWHERE = sRequeteWHERE + " CP LIKE '%" + ui->LE_CodePostal->text() + "%' AND" ;
    }

    if( ui->ChBx_AncienMembre->isChecked() )
    {
        sRequeteWHERE = sRequeteWHERE + " Ecarte=TRUE AND" ;
    }

    if( ui->ChBx_DateInscription->isChecked() )
    {
        sRequeteWHERE = sRequeteWHERE + " DateInscription>'" + ui->DtE_DI_Debut->dateTime().toString("yyyy-MM-dd")  + "' AND" ;
        sRequeteWHERE = sRequeteWHERE + " DateInscription<'" + ui->DtE_DI_Fin->dateTime().toString("yyyy-MM-dd")  + "' AND";
    }

    if( ui->ChBx_DateNaissance->isChecked() )
    {
        sRequeteWHERE = sRequeteWHERE + " DateNaissance>" + ui->DtE_DN_Debut->dateTime().toString("yyyy-MM-dd") + " AND" ;
        sRequeteWHERE = sRequeteWHERE + " DateNaissance<" + ui->DtE_DN_Fin->dateTime().toString("yyyy-MM-dd") + " AND" ;
    }

    sRequeteWHERE.remove(sRequete.size()-3, 5) ;

    sRequete = sRequeteSELECTFROM + " " + sRequeteWHERE ;
    cerr << sRequete.toStdString() << endl ;

    //Exectution de la requÃªte
    if( query.exec(sRequete) ||  true )
    {
        /*Cration des caractristiques du tableau : -Nombre de colonnes
                                                     -Nom des colonnes
                                                     -Nombre de lignes*/

        modele->setColumnCount( 3 ) ;
        modele->setRowCount( query.size() ) ;
        modele->setHorizontalHeaderItem( 0, new QStandardItem("") ) ;
        modele->setHorizontalHeaderItem( 1, new QStandardItem("Nom") ) ;
        modele->setHorizontalHeaderItem( 2, new QStandardItem( "Prenom" ) ) ;


       //Remplissage du tableau avec les informations de la table membre
        while( query.next() )
        {
            if ( this->bAdmin == true )
            {
                QStandardItem * item = new QStandardItem() ;
                item->setCheckable( true ) ;
                modele->setItem( i, 0, item ) ;

            }
            modele->setItem( i, 1, new QStandardItem( query.record().value( 3 ).toString() ) ) ;
            modele->setItem( i, 2, new QStandardItem( query.record().value( 4 ).toString() ) ) ;
            i++ ;
        }
    }
    else //Sinon on affiche un message d'erreur et on retourne Faux
    {
        cerr << "F_ListeMembres:: : query :" << query.lastError().text().toStdString() << endl ;
    }

    return true;
}

void F_ListeMembres::on_Bt_RAZ_clicked()
{
    ui->CBx_Type->clear() ;
    this->MaJType() ;

    ui->CBx_Titre->clear() ;
    this->MaJTitre() ;

    ui->LE_Nom->clear() ;

    ui->LE_Prenom->clear() ;

    ui->LE_Ville->clear() ;

    ui->LE_CodePostal->clear() ;

    ui->SBx_NbreRetard->clear() ;

    ui->DtE_DI_Debut->clear() ;
    ui->DtE_DI_Fin->clear() ;

    ui->DtE_DN_Debut->clear() ;
    ui->DtE_DN_Fin->clear() ;

    this->TousSelectionner( false ) ;

}

void F_ListeMembres::on_Bt_Deselection_clicked()
{
    this->TousSelectionner( false ) ;
}

void F_ListeMembres::on_ChBx_Type_clicked()
{
    this->AffichageListe() ;
}
